<?php
/**
* Класс-модель для работы с игровыми аккаунтами
* 
* @author GhostCPP <ghostcpp@gmail.com>
*/
class AccountForm extends AccountLogin
{
    /**
    * @var string подтверждение пароля 
    */
    public $confirmPassword;
    /**
    * @var string новый пароль, при смене пароля
    */
    public $newPassword;
    /**
    * @var string старый пароль, при смене пароля
    */
    public $oldPassword;
    /**
    * @var string пароль пользователя при восстановлении пароля
    */
    public $userPassword;
    /**
    * @var string проверочный код (каптча)
    */
    public $verifyCode;
    
    public static function model($className = __CLASS__)
    {
        return parent::model($className);
    }
    
    /**
    * Возвращает массив с правилами валидации формы
    */
    public function rules()
    {
        return array(
            // логин
            array('name', 'required', 'message' => 'Вы не ввели логин', 'on' => 'create'),
            array('name', 'length', 'min' => 5, 'max' => 20, 'tooShort' => 'Логин должен быть длиной от 5 до 20 символов', 'tooLong' => 'Логин должен быть длиной от 5 до 20 символов', 'on' => 'create'),
            array('name', 'match', 'pattern' => '/^[A-z0-9_-\s]+$/u', 'message' => 'Вы ввели неккоректный логин. Используйте только латинские буквы, цифры а также символы _ и - '),
            array('name', 'unique', 'message' => 'Введенный Вами логин уже занят, выберите другой', 'on'=>'create'),
            // пароль
            array('password', 'required', 'message' => 'Вы не ввели пароль', 'on' => 'create'),
            array('password', 'length', 'min' => 5, 'max' => 20, 'tooShort' => 'Пароль должен быть длиной от 5 до 20 символов', 'tooLong' => 'Пароль должен быть длиной от 5 до 20 символов', 'on' => 'create'),
            array('password', 'match', 'pattern' => '/^[A-z0-9_-\s]+$/u', 'message' => 'Вы ввели неккоректный пароль. Используйте только латинские буквы, цифры а также символы _ и - '),
            // повторение пароля
            array('confirmPassword', 'required', 'message' => 'Вы не ввели подтверждение пароля', 'on' => 'create, change_password'),
            array('confirmPassword', 'compare', 'compareAttribute' => 'password', 'message' => 'Вы не смогли повторить пароль', 'on' => 'create'),
            // старый пароль
            array('oldPassword', 'required', 'message' => 'Вы не ввели старый пароль', 'on' => 'change_password'),
            array('oldPassword', 'length', 'min' => 5, 'max' => 20, 'tooShort' => 'Старый пароль должен быть длиной от 5 до 20 символов', 'tooLong' => 'Старый пароль должен быть длиной от 5 до 20 символов', 'on' => 'change_password'),
            array('oldPassword', 'match', 'pattern' => '/^[A-z0-9_-\s]+$/u', 'message' => 'Вы ввели неккоректный старый пароль. Используйте только латинские буквы, цифры, а также символы _ и - '),
            array('oldPassword', 'validatorCheckPassword', 'on' => 'change_password'),
            // новый пароль
            array('newPassword', 'required', 'message' => 'Вы не ввели новый пароль', 'on' => 'change_password'),
            array('newPassword', 'length', 'min' => 5, 'max' => 20, 'tooShort' => 'Новый пароль должен быть длиной от 5 до 20 символов', 'tooLong' => 'Новый пароль должен быть длиной от 5 до 20 символов', 'on' => 'change_password'),
            array('newPassword', 'match', 'pattern' => '/^[A-z0-9-_\s]+$/u', 'message' => 'Вы ввели неккоректный новый пароль. Используйте только латинские буквы, цифры, а также символы _ и - '),
            // повторение пароля
            array('confirmPassword', 'compare', 'compareAttribute' => 'newPassword', 'message' => 'Вы не смогли повторить новый пароль', 'on' => 'change_password'),
            // пароль пользователя
            array('userPassword', 'required', 'message' => 'Вы не ввели пароль от Вашей учетной записи', 'on' => 'retrieve_password'),
            array('userPassword', 'validatorCheckUserPassword', 'on' => 'retrieve_password'),
            // проверочный код (каптча)
            array('verifyCode', 'captcha', 'allowEmpty' => !extension_loaded('gd'), 'message' => 'Вы ввели неверный код с картинки', 'on' => 'retrieve_password'),
        );
    }
    
    /**
    * Возвращает массив с метками формы
    */
    public function attributeLabels()
    {
        return array(
            'name' => Yii::t('models', 'Логин'),  
            'password' => Yii::t('models', 'Пароль'), 
            'confirmPassword' =>  Yii::t('models','Повторите пароль'),
            'oldPassword' =>  Yii::t('models','Старый пароль'),
            'newPassword' =>  Yii::t('models','Новый пароль'),
            'userPassword' =>  Yii::t('models','Пароль от Вашей учетной записи'),
            'verifyCode' => Yii::t('models', 'Проверочный код'),
        );
    }
    
    /**
    * Создать аккаунт
    */
    public function createAccount()
    {
        return $this->insert(array('name', 'password', 'sid'));               
    }
    
    /**
    * Проверить старый пароль при смене пароля
    */
    public function validatorCheckPassword()
    {
        if($this->hasErrors('oldPassword') == false)
        {
            if($this->password != strtoupper(md5($this->oldPassword)))
            {
                $this->addError('oldPassword', 'Вы ввели неверный старый пароль');
            }
        }
        
        if($this->hasErrors('oldPassword') == false)
        {
            if(strtoupper(md5($this->newPassword)) == strtoupper(md5($this->oldPassword)))
            {
               $this->addError('oldPassword', 'Ваш старый пароль совпадает с новым паролем'); 
            }            
        }   
        
        if($this->hasErrors('newPassword') == false)
        {
            if($this->newPassword == $this->name)
            {
                $this->addError('newPassword', 'Ваш пароль не может совпадать с логином');
            }
        } 
    }
    
    /**
    * Сменить пароль
    */
    public function changePassword()
    {                   
        return $this->saveAttributes(array('password'));
    }
    
    /**
    * Восстановить пароль
    */
    public function retrievePassword()     //recoverPassword
    {
        $this->password = HString::randomString();
        
        if($this->sendRetrieveMail() == true)
        {
            $this->afterValidate();
            if($this->saveAttributes(array('password')) == true)
            {
                return true;  
            }  
        }
           
        return false;
    }
    
    /**
    * Отправить письмо с новым паролем
    */
    public function sendRetrieveMail()
    {
        Yii::app()->mailer->Host = '127.0.0.1';
        Yii::app()->mailer->IsSMTP();
        Yii::app()->mailer->From = Yii::app()->params['adminEmail'];
        Yii::app()->mailer->AddAddress($this->user->email);
        Yii::app()->mailer->FromName = Yii::app()->name;
        Yii::app()->mailer->CharSet = 'UTF-8';
        Yii::app()->mailer->Subject = 'Восстановление пароля от игрового аккаунта';
        Yii::app()->mailer->Body = Yii::app()->controller->renderPartial('application.views.frontend.email._retrieveAccountPassword', array('model' => $model), true);
        
        if(Yii::app()->mailer->Send() == false)
        {
            $this->addError('userPassword', 'При отправке письма с новый паролем произошла ошибка. Пароль не был изменен. Попробуйте позже');
        
            return false;
        } 
        
        return true;  
    }
    
    /**
    * Проверить пароль пользователя при восстановлении пароля от игрового аккаунта
    */
    public function validatorCheckUserPassword()
    {
        if($this->hasErrors('userPassword') == false)
        {
            if(sha1(sha1($this->userPassword)) != $this->user->password)
            {
                $this->addError('userPassword', 'Вы ввели неверный пароль от учетной записи');
            }
        }
    }
    
    /**
    * Событие afterValidate
    * Вызывается после валидации данных
    */
    public function afterValidate()
    {
        if($this->hasErrors() == false)
        {
            switch($this->scenario)
            {
                case 'create':
                        $this->password = strtoupper(md5($this->password));
                        $this->sid = Y::userId();
                            break;
                case 'change_password':
                        $this->password = strtoupper(md5($this->newPassword));
                            break;
                case 'retrieve_password':
                        $this->password = strtoupper(md5($this->password));
                            break;
            }
        }
    }   
}